package com.peng.community.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;

@Configuration
public class RedisConfig {

    //将redisTemplate注入到容器
    /**
     * 目的有二：
     * 1. Spring自带的template为<Object, Object>，用起来很麻烦
     * 2. 配置String和Hash的k，v和对象的序列化方式（默认是使用java序列化，不支持跨语言）
     *
     * RedisConnectionFactory:redis的连接工厂，用来产生redis客户端到redis服务器连接的bean
     * 这个工厂是自动注入的，当将Bean的参数写作spring容器的另外一个bean时，他会自动将这个bean注入此方法
     * 若没有会优先创建
     */
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();

        redisTemplate.setConnectionFactory(redisConnectionFactory);

        //配置key、val的序列化器
        redisTemplate.setKeySerializer(RedisSerializer.string());
        redisTemplate.setValueSerializer(RedisSerializer.json());

        //配置hash的k，v虚拟化器
        redisTemplate.setHashKeySerializer(RedisSerializer.string());
        redisTemplate.setHashValueSerializer(RedisSerializer.json());

        //强制首先让配置生效
        redisTemplate.afterPropertiesSet();

        return redisTemplate;
    }

}
